package com.t.dianliangdemo;

import androidx.annotation.RequiresApi;
import androidx.appcompat.app.AppCompatActivity;

import android.annotation.SuppressLint;
import android.app.AlarmManager;
import android.app.PendingIntent;
import android.app.job.JobInfo;
import android.app.job.JobScheduler;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.os.Build;
import android.os.Bundle;
import android.os.PowerManager;
import android.util.Log;

public class MainActivity extends AppCompatActivity {

    private JobScheduler mJobScheduler;
    private final int JOB_ID = 1;

    @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mJobScheduler = (JobScheduler) getSystemService(Context.JOB_SCHEDULER_SERVICE);


        // initjob();

      //  aVoid();

        bVoid();

       // sendBroadcast(new Intent(this, MyWakefulReceiver.class));

    }


    @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
    public void initjob() {
        for (int i = 0; i < 30; i++) {
//        mJobScheduler = (JobScheduler) getSystemService(Context.JOB_SCHEDULER_SERVICE);
            //通过JobInfo.Builder来设定触发服务的约束条件，最少设定一个条件
            // todo 如果想要执行很多次，那么new JobInfo.Builder 中第一个函数必须是不同的！
            JobInfo.Builder jobBuilder = new JobInfo.Builder(JOB_ID, new ComponentName(this, MyjobService.class));
            //循环触发，设置任务每三秒定期运行一次
            // jobBuilder.setPeriodic(3000);

            //单次定时触发，设置为三秒以后去触发。这是与setPeriodic(long time)不兼容的，
            // 并且如果同时使用这两个函数将会导致抛出异常。
            jobBuilder.setMinimumLatency(3000);

            //在约定的时间内设置的条件都没有被触发时三秒以后开始触发。类似于setMinimumLatency(long time)，
            // 这个函数是与 setPeriodic(long time) 互相排斥的，并且如果同时使用这两个函数，将会导致抛出异常。
            jobBuilder.setOverrideDeadline(3000);

            //在设备重新启动后设置的触发条件是否还有效
            jobBuilder.setPersisted(false);

            // 只有在设备处于一种特定的网络状态时，它才触发。
            // JobInfo.NETWORK_TYPE_NONE,无论是否有网络均可触发，这个是默认值；
            // JobInfo.NETWORK_TYPE_ANY，有网络连接时就触发；
            // JobInfo.NETWORK_TYPE_UNMETERED，非蜂窝网络中触发；
            // JobInfo.NETWORK_TYPE_NOT_ROAMING，非漫游网络时才可触发；
            jobBuilder.setRequiredNetworkType(JobInfo.NETWORK_TYPE_NONE);

            //设置手机充电状态下触发
            jobBuilder.setRequiresCharging(true);

            //设置手机处于空闲状态时触发
            jobBuilder.setRequiresDeviceIdle(true);

            //得到JobInfo对象
            JobInfo jobInfo = jobBuilder.build();

            //设置开始安排任务，它将返回一个状态码
            //JobScheduler.RESULT_SUCCESS，成功
            //JobScheduler.RESULT_FAILURE，失败
            if (mJobScheduler.schedule(jobInfo) == JobScheduler.RESULT_FAILURE) {
                //安排任务失败
            }
            //停止指定JobId的工作服务
            // mJobScheduler.cancel(JOB_ID);
            //停止全部的工作服务
            // mJobScheduler.cancelAll();
        }

    }


    @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
    public void initjob2() {
        ComponentName serviceComponent = new ComponentName(this, MyjobService.class);
//频繁地唤醒
        JobScheduler jobScheduler = (JobScheduler) getSystemService(Context.JOB_SCHEDULER_SERVICE);
        for (int i = 0; i < 30; i++) {
            JobInfo jobInfo = new JobInfo.Builder(i, serviceComponent)
                    .setMinimumLatency(5000)//最小延时5秒
                    .setOverrideDeadline(60000)//最多执行时间60秒
                    //.setRequiredNetworkType(JobInfo.NETWORK_TYPE_UNMETERED)//免费的网络---wifi 蓝牙 USB
                    .setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY)//任意网络---wifi
                    .build();
            jobScheduler.schedule(jobInfo);
        }

    }

    public void aVoid() {
        // https://www.jianshu.com/p/d145616808fa?from=timeline&isappinstalled=0
        //创建唤醒锁
        PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
        @SuppressLint("InvalidWakeLockTag")
        PowerManager.WakeLock wakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "partial_lock");
        //获取唤醒锁
        wakeLock.acquire();
        //一些关键的代码
        Log.e("PowerManager", "唤醒锁");
        //释放唤醒锁
        wakeLock.release();
    }


    // 测试通过，手机 魅族note 6 ，安卓7.0系统。
    public void bVoid() {
        // todo 跳转activity是可以的，测试成功过，即使不是在锁屏的时候。
       // Intent intent = new Intent(Bactivity.this, MainActivity.class);
       // PendingIntent pi = PendingIntent.getActivity(this, 100, intent, 0);
        PendingIntent pi = PendingIntent.getBroadcast(MainActivity.this, 100, new Intent("com.example.aaa"), 0);
        AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE);
        // 每隔5秒后通过PendingIntent pi对象发送广播
        am.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), 5 * 1000, pi);
    }


    @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
    @Override
    protected void onDestroy() {
        super.onDestroy();
        mJobScheduler.cancel(JOB_ID);
        //停止全部的工作服务
        mJobScheduler.cancelAll();
    }


}
